package dcpb.re.enc;


import dcpb.re.Cost;
import it.unisa.dia.gas.jpbc.Element;
import it.unisa.dia.gas.jpbc.Field;
import it.unisa.dia.gas.jpbc.Pairing;
import it.unisa.dia.gas.plaf.jpbc.field.curve.CurveElement;
import it.unisa.dia.gas.plaf.jpbc.field.z.ZrElement;
import it.unisa.dia.gas.plaf.jpbc.pairing.PairingFactory;
import umbral.Capsule;

import java.io.IOException;
import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.AbstractMap.SimpleEntry;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

public class Demo {

	public static void main(String[] args) {
		ProxyReEncrypt  d=new ProxyReEncrypt ();
		SimpleEntry<PubParams,Element> retMap=d.setup();
		PubParams p=retMap.getKey();
		d.save(p);
		int m=5,t=3;



		int[] numbers={20,30,40,50,60};

		for(int j=0;j<numbers.length;j++){
			String numStr=""+numbers[j];
			Fabric f=new Fabric(p,m,t,retMap.getValue());
			long startTime = System.currentTimeMillis();    //获取开始时间
			int reveiverNumber=numbers[j];
			//SimpleEntry<PubParams,Element> retMap=d.setup();//CA 閻㈢喐鍨氱化鑽ょ埠閸欏倹鏆�
			List<Bob> bs=new ArrayList<Bob>();
			try (Cost c = new Cost("keyGen")) {
				for(int i=0;i<reveiverNumber;i++) {
					Bob b=new Bob(p,t,f);
					bs.add(b);
				}
			}
			Alice a=new Alice(p,m,t);
			a.setReceivers(f.getIDs());

			List<Element> mu=a.getReceivers();
			byte[] encryptedMessage;
			try (Cost c = new Cost("Enc")) {
				f.setA(mu);
				encryptedMessage=a.FileEncrypt(f.MSK, mu, f.getA());
			}
			Element rk_gen;
			try (Cost c = new Cost(numStr+"RekeyGen")) {
				rk_gen = a.RkGen(f.MSK, p.one);
			}
			Proxy pro=new  Proxy();
			byte[] rk=null;
			try(Cost c = new Cost("reEnc"))  {
				rk = pro.reEnc(a.ct,rk_gen, p);
				System.out.println(new BigInteger(rk));
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			a.ct.put("c41", rk);
			try(Cost c = new Cost("dec2")){
				for(int i=0;i<reveiverNumber;i++) {
					bs.get(i).dec2(p, a.ct, f.getA());
				}
			}
			long endTime = System.currentTimeMillis();    //获取结束时间
			//System.out.println("读写程序运行时间：" + time2 + "ms");    //输出程序运行时间
			System.out.print( (endTime - startTime)+",");    //输出程序运行时间
		}

		
		
//		f.setA(a.getReceivers());
//		
//		Element A=p.Zr.newRandomElement();//f.getA();
//		
//		
//		a.dec();
//		List<Element> P=f.aggregate(a.getReceivers());
		//b.dec3(P, mu)
//		b.getRekey();
//		b.getEncryptedMessage();
//		b.dec(A);
//		
//		PubParams p2=null;
//		try {
//			p2=d.read();
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		Bob b2=new Bob(p2,t,f);
//		//a.setReceivers(f.getIDs());
//		//Element A2=f.getA();
//		//ps=a.RkGen(A);
//		
//		//a.dec();
//		b2.getRekey(ps);
//		b2.getEncryptedMessage();
//		b2.dec(A);
//		
//		Bob b3=new Bob(p2,t,f);
//		//a.setReceivers(f.getIDs());
//		//Element A2=f.getA();
//		//ps=a.RkGen(A);
//		
//		//a.dec();
//		b3.getRekey(ps);
//		b3.getEncryptedMessage();
//		b3.dec(A);
		
//		List<Element> es=f.getIDs();
//		es.remove(1);
//		System.out.println(es.size());
//		a.setReceivers(es);
//		ps=a.RkGen(A);
//		a.dec();
//		b2.getRekey(ps);
//		b2.getEncryptedMessage();
//		b2.dec(A);


	}
//	public void test() {
//		ProxyReEncrypt  d=new ProxyReEncrypt ();
//		   int m=5,t=3;
//		   SimpleEntry<PubParams,Element> retMap=d.setup();//CA 閻㈢喐鍨氱化鑽ょ埠閸欏倹鏆�
//			PubParams p=retMap.getKey();
//		   
//		   Element ID_i=p.Zr.newRandomElement();
//		   SimpleEntry<Element,Element> ski=d.KeyGen(p, retMap.getValue(),ID_i);
//		  
//		   
//		   ZrElement M=(ZrElement) p.Zr.newRandomElement();// 鐎靛湱袨閸旂姴鐦戦惃鍕潩闁斤拷
//		   String message="hello world";// 鐟曚礁褰傞柅浣烘畱娣団剝浼�
//		   byte[] encryptedMessage=d.encrypt(message.getBytes(),M.toBytes());
//		   System.out.println("message:"+M.toString());
//		   SimpleEntry<Map,Map> content=d.Enc(p,M,null);//sita C
//		   List<Element> mu=new LinkedList<Element>();
//		   mu.add(ID_i);
//		   SimpleEntry<Element,Element> rkws=d.RkGen(p, mu,null,content.getKey());//rkw_1,rkw_2
//		   SimpleEntry<List<Element>,List<Element>> xsAndYs=d.getSecret((ZrElement) rkws.getValue(), m, t, p);
//		  
//		
//		    Map<String,Element> c1=null;
//		   for(int i=0;i<t;i++) {
//			  c1=d.ReEnc(content.getValue(),rkws.getKey(), xsAndYs.getValue().get(i));
//			  xsAndYs.getValue().set(i,c1.get("c31"));
//		   }
//
//		 
//		   byte[] m1=d.Dec1(p,content.getKey(),content.getValue());
//		   System.out.println("DEC1-message:"+new BigInteger(m1).toString());
//
//		   byte[] m2=d.Dec2(p,mu,t,(byte[])content.getValue().get("c1"),c1.get("c21"),xsAndYs,ski);
//		   System.out.println("DEC2-message:"+new BigInteger(m2).toString());
//		   try {
//			   message=new String(d.decrypt(encryptedMessage, new BigInteger(m2).toByteArray()));
//			   System.out.println(message);
//			} catch (Exception e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//		   //d.test();
//	}
	void upLoadFile(byte[] file) {
		return;
	}
	
}